#!/bin/bash

# 开放第三方项目使用Docker服务权限脚本（Docker启动后延时修改权限脚本）

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 变量定义
SCRIPT_PATH="/usr/local/bin/docker-socket-delayed-fix.sh"
OVERRIDE_DIR="/etc/systemd/system/docker.service.d"
OVERRIDE_FILE="$OVERRIDE_DIR/delayed-fix.conf"
DOCKER_SOCKET="/var/run/docker.sock"
LOG_FILE="/var/log/docker-socket-fix.log"

# 显示标题
echo -e "${BLUE}"
echo "========================================"
echo "  开放第三方项目使用Docker服务权限脚本"
echo "    （Docker启动后延时修改权限）"
echo "========================================"
echo -e "${NC}"

# 检查当前状态
check_status() {
    echo -e "${YELLOW}检查当前状态...${NC}"
    
    # 检查脚本文件
    if [ -f "$SCRIPT_PATH" ]; then
        echo -e "延时脚本: ${GREEN}已安装${NC}"
        echo -e "脚本路径: $SCRIPT_PATH"
        
        # 显示当前等待时间
        local wait_time=$(grep "sleep" "$SCRIPT_PATH" | head -1 | awk '{print $2}')
        echo -e "当前等待时间: ${YELLOW}${wait_time}秒${NC}"
    else
        echo -e "延时脚本: ${RED}未安装${NC}"
    fi
    
    echo ""
    
    # 检查覆盖配置
    if [ -f "$OVERRIDE_FILE" ]; then
        echo -e "覆盖配置: ${GREEN}已安装${NC}"
        echo -e "配置文件: $OVERRIDE_FILE"
        echo -e "文件内容:"
        cat "$OVERRIDE_FILE"
    else
        echo -e "覆盖配置: ${RED}未安装${NC}"
    fi
    
    echo ""
    
    # 检查日志
    if [ -f "$LOG_FILE" ]; then
        echo -e "修改日志: ${GREEN}存在${NC}"
        echo -e "日志路径: $LOG_FILE"
        echo -e "最近日志:"
        tail -5 "$LOG_FILE"
    else
        echo -e "修改日志: ${RED}不存在${NC}"
    fi
    
    echo ""
    
    # 检查 Docker socket 权限
    if [ -e "$DOCKER_SOCKET" ]; then
        local perms=$(ls -la "$DOCKER_SOCKET" | awk '{print $1}')
        echo -e "Docker Socket 权限: $perms"
        
        if [ "$perms" = "srw-rw-rw-" ]; then
            echo -e "权限状态: ${GREEN}开放（所有用户可访问）${NC}"
        else
            echo -e "权限状态: ${RED}受限（仅 root 和 docker 组可访问）${NC}"
        fi
    else
        echo -e "Docker Socket: ${RED}不存在${NC}"
    fi
}

# 显示管理命令备忘
show_management_commands() {
    echo -e "${BLUE}"
    echo "========================================"
    echo "          管理命令备忘"
    echo "========================================"
    echo -e "${NC}"
    
    echo -e "${YELLOW}📋 常用管理命令${NC}"
    echo -e "  ${GREEN}查看实时日志${NC}    : sudo tail -f $LOG_FILE"
    echo -e "  ${GREEN}重启 Docker 服务${NC} : sudo systemctl restart docker.service"
    echo -e "  ${GREEN}检查服务状态${NC}    : sudo systemctl status docker.service"
    echo -e "  ${GREEN}测试 Docker${NC}      : docker ps"
    echo ""
    
    echo -e "${YELLOW}⚙️ 配置调整${NC}"
    echo -e "  ${GREEN}调整等待时间${NC}    : sudo nano $SCRIPT_PATH"
    echo -e "    修改 'sleep 10' 中的数字 (当前: $(grep "sleep" "$SCRIPT_PATH" 2>/dev/null | head -1 | awk '{print $2}' || echo "未知")秒)"
    echo -e "  ${GREEN}重新加载配置${NC}    : sudo systemctl daemon-reload && sudo systemctl restart docker.service"
    echo ""
    
    echo -e "${YELLOW}📁 文件位置${NC}"
    echo -e "  ${GREEN}延时脚本${NC}  : $SCRIPT_PATH"
    echo -e "  ${GREEN}覆盖配置${NC}  : $OVERRIDE_FILE"
    echo -e "  ${GREEN}日志文件${NC}  : $LOG_FILE"
    echo -e "  ${GREEN}Docker Socket${NC}: $DOCKER_SOCKET"
    echo ""
    
    echo -e "${YELLOW}🔍 故障排查${NC}"
    echo -e "  ${GREEN}检查脚本执行${NC}    : 查看日志文件是否有新记录"
    echo -e "  ${GREEN}检查权限状态${NC}    : ls -la $DOCKER_SOCKET"
    echo -e "  ${GREEN}检查服务配置${NC}    : sudo systemctl cat docker.service"
    echo -e "  ${GREEN}查看系统日志${NC}    : sudo journalctl -u docker.service -n 20"
    echo ""
    
    echo -e "${YELLOW}🛠️ 高级操作${NC}"
    echo -e "  ${GREEN}手动修改权限${NC}    : sudo chmod 666 $DOCKER_SOCKET"
    echo -e "  ${GREEN}查看进程状态${NC}    : ps aux | grep docker-socket-delayed"
    echo -e "  ${GREEN}清理日志文件${NC}    : sudo truncate -s 0 $LOG_FILE"
    echo -e "  ${GREEN}手动运行脚本${NC}    : sudo $SCRIPT_PATH"
    echo ""
    
    echo -e "${YELLOW}📝 使用提示${NC}"
    echo -e "  • 重启 Docker 服务后会自动触发权限修改"
    echo -e "  • 系统重启后配置依然有效"
    echo -e "  • 如果 Docker 启动较慢，可适当增加等待时间"
    echo -e "  • 日志文件会记录每次权限修改的时间"
    echo ""
}

# 安装延时修改方案
install_delayed_solution() {
    # 检查当前权限状态
    if [ -e "$DOCKER_SOCKET" ]; then
        local perms=$(stat -c "%a" "$DOCKER_SOCKET")
        if [ "$perms" = "666" ]; then
            echo -e "${YELLOW}您目前的$DOCKER_SOCKET权限状态为0666（已开放）${NC}"
            
            # 循环等待有效输入
            while true; do
                read -p "确认继续安装吗？这将会重启docker，请注意先保存数据！(y/Y继续, n/N取消): " confirm
                case $confirm in
                    [yY])
                        echo -e "${GREEN}继续安装...${NC}"
                        break
                        ;;
                    [nN])
                        echo -e "${YELLOW}取消安装，返回主菜单。${NC}"
                        return
                        ;;
                    *)
                        echo -e "${RED}输入错误，请输入 y/Y 或 n/N${NC}"
                        ;;
                esac
            done
        fi
    fi
    
    echo -e "${YELLOW}正在安装 Docker Socket 延时权限修改...${NC}"
    
    # 创建延时脚本
    sudo tee "$SCRIPT_PATH" > /dev/null << 'EOF'
#!/bin/bash
# 等待 Docker socket 创建并稳定
sleep 10

# 设置权限
if [ -e /var/run/docker.sock ]; then
    chmod 666 /var/run/docker.sock
    echo "$(date): Docker socket permissions fixed" >> /var/log/docker-socket-fix.log
fi
EOF

    sudo chmod +x "$SCRIPT_PATH"
    echo -e "${GREEN}延时脚本已创建: $SCRIPT_PATH${NC}"
    
    # 创建覆盖配置
    sudo mkdir -p "$OVERRIDE_DIR"
    
    sudo tee "$OVERRIDE_FILE" > /dev/null << EOF
[Service]
ExecStartPost=/bin/bash -c "$SCRIPT_PATH &"
EOF

    echo -e "${GREEN}覆盖配置文件已创建${NC}"
    
    # 重新加载 systemd 配置
    sudo systemctl daemon-reload
    echo -e "${GREEN}systemd 配置已重新加载${NC}"
    
    # 重启 Docker 服务
    sudo systemctl restart docker.service
    echo -e "${GREEN}Docker 服务已重启${NC}"
    
    # 等待延时脚本执行
    echo -e "${YELLOW}等待延时脚本执行 (12秒)...${NC}"
    sleep 12
    
    # 验证权限
    if [ -e "$DOCKER_SOCKET" ]; then
        local perms=$(ls -la "$DOCKER_SOCKET" | awk '{print $1}')
        if [ "$perms" = "srw-rw-rw-" ]; then
            echo -e "${GREEN}✓ Docker 权限已成功开放！${NC}"
        else
            echo -e "${RED}✗ 权限设置可能未生效，当前权限: $perms${NC}"
        fi
    fi
    
    echo -e "${GREEN}✓ Docker 权限延时修改已安装！${NC}"
    echo -e "${YELLOW}注意: 使用延时后台脚本，无需持续运行的监控进程${NC}"
}

# 卸载延时修改方案
uninstall_delayed_solution() {
    echo -e "${YELLOW}正在检查卸载状态...${NC}"
    
    # 检查相关文件是否存在
    local files_exist=0
    local files_list=()
    
    if [ -f "$OVERRIDE_FILE" ]; then
        files_exist=$((files_exist+1))
        files_list+=("$OVERRIDE_FILE")
    fi
    
    if [ -f "$SCRIPT_PATH" ]; then
        files_exist=$((files_exist+1))
        files_list+=("$SCRIPT_PATH")
    fi
    
    if [ -f "$LOG_FILE" ]; then
        files_exist=$((files_exist+1))
        files_list+=("$LOG_FILE")
    fi
    
    # 如果所有文件都不存在，提示无需卸载
    if [ $files_exist -eq 0 ]; then
        echo -e "${GREEN}所有相关文件均已不存在，无需卸载。${NC}"
        echo -e "${YELLOW}无需执行卸载操作，返回主菜单。${NC}"
        return
    fi
    
    # 显示存在的文件
    echo -e "${YELLOW}发现以下文件存在:${NC}"
    for file in "${files_list[@]}"; do
        echo -e "  - $file"
    done
    
    # 循环等待有效输入
    while true; do
        read -p "确认继续卸载吗？这将会重启docker，请注意先保存数据！(y/Y继续, n/N取消): " confirm
        case $confirm in
            [yY])
                echo -e "${GREEN}继续卸载...${NC}"
                break
                ;;
            [nN])
                echo -e "${YELLOW}取消卸载，返回主菜单。${NC}"
                return
                ;;
            *)
                echo -e "${RED}输入错误，请输入 y/Y 或 n/N${NC}"
                ;;
        esac
    done
    
    echo -e "${YELLOW}正在卸载 Docker 权限延时修改...${NC}"
    
    # 删除覆盖配置
    if [ -f "$OVERRIDE_FILE" ]; then
        sudo rm -f "$OVERRIDE_FILE"
        echo -e "${GREEN}覆盖配置文件已删除${NC}"
        
        # 检查目录是否为空，如果是则删除
        if [ -d "$OVERRIDE_DIR" ] && [ -z "$(ls -A "$OVERRIDE_DIR")" ]; then
            sudo rmdir "$OVERRIDE_DIR"
            echo -e "${GREEN}空目录 $OVERRIDE_DIR 已删除${NC}"
        fi
    fi
    
    # 删除延时脚本
    if [ -f "$SCRIPT_PATH" ]; then
        sudo rm -f "$SCRIPT_PATH"
        echo -e "${GREEN}延时脚本已删除${NC}"
    fi
    
    # 删除日志文件（可选）
    if [ -f "$LOG_FILE" ]; then
        sudo rm -f "$LOG_FILE"
        echo -e "${GREEN}日志文件已删除${NC}"
    fi
    
    # 重新加载 systemd 配置
    sudo systemctl daemon-reload
    echo -e "${GREEN}systemd 配置已重新加载${NC}"
    
    # 重启 Docker 服务
    sudo systemctl restart docker.service
    echo -e "${GREEN}Docker 服务已重启${NC}"
    
    echo -e "${GREEN}✓ Docker 权限延时修改已卸载！${NC}"
}

# 重启测试
restart_test() {
    echo -e "${YELLOW}执行重启测试...${NC}"
    
    local initial_perms=$(stat -c "%a" "$DOCKER_SOCKET" 2>/dev/null || echo "不存在")
    echo -e "重启前权限: $initial_perms"
    
    # 重启 Docker 服务
    echo -e "重启 Docker 服务..."
    if sudo systemctl restart docker.service; then
        echo -e "${GREEN}Docker 服务重启成功${NC}"
    else
        echo -e "${RED}Docker 服务重启失败${NC}"
        return 1
    fi
    
    # 等待延时脚本执行
    echo -e "等待延时脚本执行 (12秒)..."
    sleep 12
    
    # 检查重启后权限
    local after_restart_perms=$(stat -c "%a" "$DOCKER_SOCKET" 2>/dev/null || echo "不存在")
    echo -e "重启后权限: $after_restart_perms"
    
    # 测试 Docker 命令
    echo -e "测试 Docker 命令..."
    if docker ps > /dev/null 2>&1; then
        echo -e "${GREEN}✓ Docker 命令执行成功${NC}"
    else
        echo -e "${RED}✗ Docker 命令执行失败${NC}"
    fi
    
    if [ "$after_restart_perms" = "666" ]; then
        echo -e "${GREEN}✓ 权限修改成功${NC}"
    else
        echo -e "${RED}✗ 权限修改失败${NC}"
    fi
    
    # 查看最新日志
    echo -e "\n最新日志:"
    sudo tail -3 "$LOG_FILE" 2>/dev/null || echo "无日志"
}

# 显示菜单
show_menu() {
    echo -e "${BLUE}请选择操作:${NC}"
    echo -e "${YELLOW}注意：安装和卸载会重启docker服务！${NC}"
    echo -e "${YELLOW}     请务必先对运行中的容器做好数据保存并退出！${NC}"
    echo -e "  ${GREEN}1${NC}) 安装开放docker权限使用（权限改为666）"
    echo -e "  ${GREEN}2${NC}) 卸载（清理相关文件）"
    echo -e "  ${GREEN}3${NC}) 检查当前状态"
    echo -e "  ${GREEN}4${NC}) 执行重启测试"
    echo -e "  ${GREEN}5${NC}) 管理命令备忘"
    echo -e "  ${GREEN}6${NC}) 退出"
    echo ""
    read -p "请输入选择 [1-6]: " choice
}

# 主函数
main() {
    # 检查是否以 root 运行
    if [ "$EUID" -ne 0 ]; then
        echo -e "${RED}错误: 此脚本需要以 root 权限运行${NC}"
        echo "请使用: sudo $0"
        exit 1
    fi
    
    while true; do
        show_menu
        
        case $choice in
            1)
                check_status
                install_delayed_solution
                ;;
            2)
                check_status
                uninstall_delayed_solution
                ;;
            3)
                check_status
                ;;
            4)
                check_status
                restart_test
                ;;
            5)
                show_management_commands
                ;;
            6)
                echo -e "${BLUE}再见！${NC}"
                exit 0
                ;;
            *)
                echo -e "${RED}无效选择，请重新输入${NC}"
                ;;
        esac
        
        echo ""
        read -p "按 Enter 键返回主菜单..."
        echo ""
    done
}

# 运行主函数
main "$@"